Services a DCOM

Otázka od: Zbysek Hlinka

18. 9. 2002 17:18

Ahoj,

mate nekdo zkusenost s provozovanim DCOM a services?

Jaky je stav: exac, ktery ma COM interface a bezi na jednom pocitaci.
Dalsi program na jinem pocitaci se k tomuto programu pripojuje a
komunikuje s mim pres interface. Pokud je prvni program spusten
normalne, vse beha OK. Nedari ze vsak pripojeni, pokud je prvni
program spusten jako service, druhy program ho neumi najit. Nevi
nekdo, kde by mohl byt problem?

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Jan Sebelík

19. 9. 2002 9:14

Subject: Re: Services a DCOM
Ahoj Zbysku,
dotaz posilam v kopii V.Bodeckovi (kurz COM/DCOM).
Podle meho soudu to je otazka security.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
----------
> Odesílatel: Zbysek Hlinka <hlinka@hlinka.cz>
> Komu: delphi-l@clexpert.cz
> Předmět: Services a DCOM
> Datum: 18. září 2002 16:27
>
> Ahoj,
>
> mate nekdo zkusenost s provozovanim DCOM a services?
>
> Jaky je stav: exac, ktery ma COM interface a bezi na jednom pocitaci.
> Dalsi program na jinem pocitaci se k tomuto programu pripojuje a
> komunikuje s mim pres interface. Pokud je prvni program spusten
> normalne, vse beha OK. Nedari ze vsak pripojeni, pokud je prvni
> program spusten jako service, druhy program ho neumi najit. Nevi
> nekdo, kde by mohl byt problem?
>
> S pozdravem
>
> Zbysek Hlinka
> E-mail: hlinka@hlinka.cz, localizator@localizator.com
> Phone: +420 603 551 282

Odpovedá: Alexandr Stefek

19. 9. 2002 16:53

Krome Nastaveni security je potreba do registru nastavit jeste nejake
klice (napr. LocalService pod, tusim CLSID).
Ja osobne pridavam do .dpr napr. nasledujici kod (samozrejme lze
optimalizovat):

begin
  ComServer.UIInteractive := False;

  if FindSwitch('INSTALL') then begin
    CreateRegKey('CLSID\' + GUIDToString(CLASS_TransferOBJ), 'AppID',
GUIDToString(CLASS_TransferOBJ));
    CreateRegKey('AppID\' + GUIDToString(CLASS_TransferOBJ), '',
'TransferOBJ');
    CreateRegKey('AppID\' + GUIDToString(CLASS_TransferOBJ), 'LocalService',
'TransferLayer');
  end else
    if FindSwitch('UNINSTALL') then begin
      DeleteRegKey('CLSID\' + GUIDToString(CLASS_TransferOBJ));
      DeleteRegKey('AppID\' + GUIDToString(CLASS_TransferOBJ));
    end;

Pritom CLASS_TransferOBJ je GUID tridy,
TransferLayer je nazev sluzby, ktera DCOM obsluhuje.

Dale je potreba do implementacni unity pridat

initialization
  if not (FindSwitch('INSTALL') or FindSwitch('UNINSTALL')) then begin
    TAutoObjectFactory.Create(ComServer, TTransferOBJ, Class_TransferOBJ,
      ciMultiInstance, tmApartment);
  end;

V opacne pripade to pri instalaci dela problemy (pokud si vzpominam).

Snad to pro zacatek staci.

Alexandr STEFEK
----- Original Message -----
From: "Zbysek Hlinka" <hlinka@hlinka.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, September 18, 2002 4:27 PM
Subject: Services a DCOM


> Ahoj,
>
> mate nekdo zkusenost s provozovanim DCOM a services?
>
> Jaky je stav: exac, ktery ma COM interface a bezi na jednom pocitaci.
> Dalsi program na jinem pocitaci se k tomuto programu pripojuje a
> komunikuje s mim pres interface. Pokud je prvni program spusten
> normalne, vse beha OK. Nedari ze vsak pripojeni, pokud je prvni
> program spusten jako service, druhy program ho neumi najit. Nevi
> nekdo, kde by mohl byt problem?
>
> S pozdravem
>
> Zbysek Hlinka
> E-mail: hlinka@hlinka.cz, localizator@localizator.com
> Phone: +420 603 551 282
>

Odpovedá: Zbysek Hlinka

20. 9. 2002 10:43

On 19 Sep 2002 at 15:49, Alexandr Stefek wrote:

> Krome Nastaveni security je potreba do registru nastavit jeste nejake
> klice (napr. LocalService pod, tusim CLSID). Ja osobne pridavam do
> .dpr napr. nasledujici kod (samozrejme lze optimalizovat):

Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
nejlepsim pripade, ze pristup byl odepren. Mam to blbe umistene, nebo
je treba jeste neco nekde nastavit? Takto vypada .dpr:

{$R *.TLB}

{$R *.RES}

function Installing: Boolean;
begin
  Result := FindCmdLineSwitch('INSTALL', ['-','\','/'], True) or
            FindCmdLineSwitch('UNINSTALL', ['-','\','/'], True);
end;

function StartService: Boolean;
var
  Mgr, Svc: Integer;
  UserName, ServiceStartName: string;
  Config: Pointer;
  Size: DWord;
begin
  Result := False;
  Mgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if Mgr <> 0 then
  begin
    Svc := OpenService(Mgr, PChar(SServiceName), SERVICE_ALL_ACCESS);
    Result := Svc <> 0;
    if Result then
    begin
      QueryServiceConfig(Svc, nil, 0, Size);
      Config := AllocMem(Size);
      try
        QueryServiceConfig(Svc, Config, Size, Size);
        ServiceStartName :=
PQueryServiceConfig(Config)^.lpServiceStartName;
        if CompareText(ServiceStartName, 'LocalSystem') = 0 then
          ServiceStartName := 'SYSTEM';
      finally
        Dispose(Config);
      end;
      CloseServiceHandle(Svc);
    end;
    CloseServiceHandle(Mgr);
  end;
  if Result then
  begin
    Size := 256;
    SetLength(UserName, Size);
    GetUserName(PChar(UserName), Size);
    SetLength(UserName, StrLen(PChar(UserName)));
    Result := CompareText(UserName, ServiceStartName) = 0;
  end;
end;

begin
  if not Installing then
  begin
    CreateMutex(nil, True, 'QM1MAINSERV');
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageBox(0, PChar(SAlreadyRunning), PChar(SApplicationName),
MB_ICONERROR);
      Halt;
    end;
  end;
    ComServer.UIInteractive := False;
    if FindCmdLineSwitch('INSTALL', ['-','\','/'], True) then begin
      CreateRegKey('CLSID\' + GUIDToString(CLASS_QMCommunics),
'AppID', GUIDToString(CLASS_QMCommunics));
      CreateRegKey('AppID\' + GUIDToString(CLASS_QMCommunics), '',
SServiceName);
      CreateRegKey('AppID\' + GUIDToString(CLASS_QMCommunics),
'LocalService', SServiceName);
    end else
    if FindCmdLineSwitch('UNINSTALL', ['-','\','/'], True) then
    begin
      DeleteRegKey('CLSID\' + GUIDToString(CLASS_QMCommunics));
      DeleteRegKey('AppID\' + GUIDToString(CLASS_QMCommunics));
    end;
  if Installing or StartService then
  begin
    SvcMgr.Application.Initialize;
    SocketService := TSocketService.CreateNew(SvcMgr.Application, 0);
    SvcMgr.Application.CreateForm(TQMForm, QMForm);
    SvcMgr.Application.Run;
  end else
  begin
    Forms.Application.ShowMainForm := False;
    Forms.Application.Initialize;
    Forms.Application.CreateForm(TQMForm, QMForm);
    QMForm.Initialize(False);
    Forms.Application.Run;
  end;
end.
S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Zbysek Hlinka

20. 9. 2002 13:00

On 20 Sep 2002 at 8:38, Zbysek Hlinka wrote:

> On 19 Sep 2002 at 15:49, Alexandr Stefek wrote:
>
> > Krome Nastaveni security je potreba do registru nastavit jeste
> > nejake klice (napr. LocalService pod, tusim CLSID). Ja osobne
> > pridavam do .dpr napr. nasledujici kod (samozrejme lze
> > optimalizovat):
>
> Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
> nejlepsim pripade, ze pristup byl odepren.

Jeste bych mel rict, ze klient se snazi spustit instanci serveru,
ktera uz bezi. Dalsi instanci spustit lze, ale to neni zadouci.

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Malecek Ondrej

20. 9. 2002 13:21



> -----Původní zpráva-----
> > Krome Nastaveni security je potreba do registru nastavit jeste
> > > nejake klice (napr. LocalService pod, tusim CLSID). Ja osobne
> > > pridavam do .dpr napr. nasledujici kod (samozrejme lze
> > > optimalizovat):
> >
> > Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
> > nejlepsim pripade, ze pristup byl odepren.
>
> Jeste bych mel rict, ze klient se snazi spustit instanci serveru,
> ktera uz bezi. Dalsi instanci spustit lze, ale to neni zadouci.
---------------------------------------------------------
Tohle resim prepsanim TAutoObjectFactory.CreateInstance v jejim potomkovi,
ktera mi vraci jednu a tu samou instanci a nevytavri dalsi. Mam dojem, ze
jeste bylo potreba class factory registrovat pomoci RegisterClassObject,
jinac se vytvari i dalsi instance class factory. Ale to si nejsem jist
jestli neni potreba pouze pri pouziti v jinem nez primarnim vlaknu.
Nepouzivam to tedy v service, ale postup je to obecne platny.

O  

Odpovedá: Alexandr Stefek

23. 9. 2002 7:08

> On 20 Sep 2002 at 8:38, Zbysek Hlinka wrote:
>
> > On 19 Sep 2002 at 15:49, Alexandr Stefek wrote:
> >
> > > Krome Nastaveni security je potreba do registru nastavit jeste
> > > nejake klice (napr. LocalService pod, tusim CLSID). Ja osobne
> > > pridavam do .dpr napr. nasledujici kod (samozrejme lze
> > > optimalizovat):
> >
> > Zkousel jsem ruzne moznosti, ale vzdy mi to hlasilo nejakou chybu. V
> > nejlepsim pripade, ze pristup byl odepren.
>
> Jeste bych mel rict, ze klient se snazi spustit instanci serveru,
> ktera uz bezi. Dalsi instanci spustit lze, ale to neni zadouci.
>
 Je dobre se pomoci dcomcnfg presvedcit, ze je DCOM
 pripojen skutecne na sluzbu (samozrejme po instalaci apod.)
 (popisovany jev nastava ve chvili, kdy to neni OK)
 V patricnem dialogu se objevi (nemam to ted pred sebou, takze
 potim z hlavy) RunAs, nebo neco takoveho a tamtez by mela
 byt zvolena volba service ci co.
 Pozor tento zpusob ale je pseudo DCOM service, vse bezi v hlavnim vlaknu.
 Presto, mam to overeno jako celkem funkcni.
 Doporucuji se podivat na
 http://www.aldyn.ru/articles/dcom_in_service/index.html
 Ale s trochou casu a usili by to mohlo jit jeste poopravit, aby to vse
 bylo OK.

 Alexandr STEFEK